#!/bin/bash
# control.sh
# 负责控制后端模块的启动、停止、重启、查看状态、查看日志

set -e

##################### 获取工作目录 #####################
# 参考：http://www.gimoo.net/t/1502/54ea928e14fef.html
SOURCE="$0"
while [ -h "$SOURCE"  ]; do                              # resolve $SOURCE until the file is no longer a symlink
    DIR="$( cd -P "$( dirname "$SOURCE"  )" && pwd  )"
    SOURCE="$(readlink "$SOURCE")"
    [[ $SOURCE != /*  ]] && SOURCE="$DIR/$SOURCE"        # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
DIR="$( cd -P "$( dirname "$SOURCE"  )" && cd .. && pwd  )"
#######################################################

app=$(basename "$DIR")  # app="ems"
workdir=$DIR            # workdir="/opt/$app"

# ----------------------------- 参数处理 start

# 这里的代码主要为了获取 -p -d 两个参数

set -- $(getopt -q -u p:d "$@")

while [ -n "$1" ]
do
    case "$1" in
    -p)
        profile="$2"
        echo "Found the -p option, with parameter value $profile"
        shift
        ;;
    -d)
        echo "Found the -d option"
        run_as_daemon="-d"
        ;;
    --)
        shift
        break
        ;;
    *)
        echo "$1 is not option"
        ;;
    esac
    shift
done

# 参数：<模块>，可能的值：
#   固定为 archive
module="archive"

# 参数：<命令>，可能的值：
#   start, stop, restart, status, log
cmd=$1

# 参数：<命令>，可能的值：
#   start, stop, restart, status, log
log_level=${2:-info}

jar_name="$app-$module"
jar_file="$jar_name.jar"
jar_dir=$workdir/module/$module
# log_dir=./config/logback-$profile.xml
yml_dir0=./config/application.yml
yml_dir1=./config/application-$profile.yml
log_file=$workdir/module/$module/logs/${jar_name}.log
jvm_args=("-Xms500M" "-Xmx500M" )
#spring_args=("--logging.config=$log_dir" "--spring.config.location=$yml_dir0,$yml_dir1" "--spring.profiles.active=$profile")
spring_args=("--spring.config.location=$yml_dir0,$yml_dir1" "--spring.profiles.active=$profile")


# ----------------------------- 参数处理 end

#使用说明，用来提示输入参数
usage() {
    echo -e "--------------------------------------------------------"
    echo -e "HELP: 用法：./control.sh <命令> [-p 环境] [-d] [info|error]"
    echo -e "HELP: <命令>："
    echo -e "HELP:     stop                   停止"
    echo -e "HELP:     start                  启动"
    echo -e "HELP:         ├─ -p <profile>      ├─指定环境 profile"
    echo -e "HELP:         └─ -d                └─后台启动"
    echo -e "HELP:     restart                重启"
    echo -e "HELP:         ├─ -p <profile>      ├─指定环境 profile"
    echo -e "HELP:         └─ -d                └─后台启动"
    echo -e "HELP:     status                 查看状态"
    echo -e "HELP:     log                    查看日志"
    echo -e "HELP:      ├─ info                 ├─ info 级别的日志"
    echo -e "HELP:      └─ error                └─ error 级别的日志"    
    echo -e "HELP: 注意："
    echo -e "HELP:     -p -d 参数要按顺序输入"
    echo -e "HELP:     info|error 仅当命令为 log 时有效，用于区分不同日志文件"
    echo -e "--------------------------------------------------------"
    exit 1
}

# 检查，必须传入<模块>
if [ -z "$module" ]; then
  echo "ERR : 必须传入<模块>"
  usage
fi

# 检查，必须传入<命令>
if [ -z "$cmd" ]; then
  echo "ERR : 必须传入<命令>"
  usage
fi


# 函数：停止
do_stop(){
  # 查询进程 id
  pid=$(ps -ef | grep "$jar_file" | grep -v grep | awk '{print $2}')
  echo "INFO: [$module] $jar_file 进程 id：[$pid]"

  if [ -n "$pid" ]; then
    echo "INFO: [$module] 杀死 $jar_file 进程：$pid"
    kill -9 $pid
  else
    echo "INFO: [$module] ${jar_file} 进程没有运行"
  fi
}

# 函数：启动
do_start(){

  # 查询进程 id
  pid=$(ps -ef | grep "$jar_file" | grep -v grep | awk '{print $2}')
  if [ -n "$pid" ]
    then
      echo "INFO: [$module] $jar_file 进程已在运行：${pid}"
    else
      echo "INFO: [$module] $jar_file 进程没有运行，启动进程..."
      # 切换目录
      echo "INFO: [$module] 切换目录: $jar_dir"
      cd $jar_dir
      # 创建日志目录
      if [ ! -d $jar_dir/logs ]; then
        echo "INFO: [$module] 创建日志目录 $jar_dir/logs"
        mkdir $jar_dir/logs
      fi
      # 前台运行或后台运行
      if [ "$run_as_daemon" = "-d" ]
        then
          echo "INFO: [$module] 后台运行 $jar_file"

          # 后台运行，重定向日志
          # echo "INFO: [$module] nohup java ${jvm_args[*]} -jar $jar_file --spring.config.location=$yml_dir0,$yml_dir1 --spring.profiles.active=$profile >$log_file &"
          #                       nohup java ${jvm_args[*]} -jar $jar_file --spring.config.location=$yml_dir0,$yml_dir1 --spring.profiles.active=$profile >$log_file &

          # 后台运行，没有重定向日志
          #echo "INFO: [$module] nohup java ${jvm_args[*]} -jar $jar_file --spring.config.location=$yml_dir --spring.profiles.active=$profile >/dev/null 2>&1 &"
          #                      nohup java ${jvm_args[*]} -jar $jar_file --spring.config.location=$yml_dir --spring.profiles.active=$profile >/dev/null 2>&1 &
          echo "INFO: [$module] nohup java ${jvm_args[*]} -jar $jar_file ${spring_args[*]} >/dev/null 2>&1 &"
                                nohup java ${jvm_args[*]} -jar $jar_file ${spring_args[*]} >/dev/null 2>&1 &

        else
          # 前台运行
          echo "INFO: [$module] 前台运行 $jar_file"
          echo "INFO: [$module] java ${jvm_args[*]} -jar $jar_file ${spring_args[*]}"
                                java ${jvm_args[*]} -jar $jar_file ${spring_args[*]}
      fi
  fi
}


# 函数：重启
do_restart(){
  do_stop
  do_start
}

# 函数：查看状态
do_status(){
  # 查询进程 id
  pid=$(ps -ef | grep "$jar_file" | grep -v grep | awk '{print $2}')
  if [ -n "$pid" ]; then
    echo "INFO: [$module] ${jar_file} 进程正在运行：${pid}"
  else
    echo "INFO: [$module] ${jar_file} 没有运行"
  fi
}

# 函数：查看日志
do_log(){
  if [ ! -f $log_file ]
    then
      echo "ERR : [$module] 日志文件不存在：[$log_file]"
    else
      echo "INFO: [$module] tail -fn 1000 $log_file"
                            sleep 1s
                            tail -fn 1000 "$log_file"
  fi
}

# 程序入口
case "$cmd" in
  "start")
    do_start
    ;;
  "stop")
    do_stop
    ;;
  "restart")
    do_restart
    ;;
  "status")
    do_status
    ;;
  "log")
    do_log
    ;;  
  *)
    usage
    ;;
esac
